package org.dromara.common.core.config

import jakarta.validation.Validator
import org.hibernate.validator.HibernateValidator
import org.springframework.boot.autoconfigure.AutoConfiguration
import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration
import org.springframework.context.MessageSource
import org.springframework.context.annotation.Bean
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean
import java.util.*

/**
 * 校验框架配置类
 *
 * @author Lion Li
 * @updater LikeYouDo
 */
@AutoConfiguration(before = [ValidationAutoConfiguration::class])
class ValidatorConfig {

    /**
     * 配置校验框架 快速失败模式
     */
    @Bean
    fun validator(messageSource: MessageSource): Validator {
        // use函数是kotlin的语法糖，用于在使用资源（如文件、流等）后自动关闭它们。使用 use 函数可以确保资源在不再需要时被正确释放，从而避免资源泄漏和其他问题。
        // 和我们写try with resource是一样的，使用use会自动close资源
        // use函数只能用于实现了 Closeable 接口的类
        LocalValidatorFactoryBean().use { factoryBean ->
            // 国际化
            factoryBean.setValidationMessageSource(messageSource)
            // 设置使用 HibernateValidator 校验器
            factoryBean.setProviderClass(HibernateValidator::class.java)
            val properties = Properties()
            // 设置快速失败模式（fail-fast），即校验过程中一旦遇到失败，立即停止并返回错误
            properties.setProperty("hibernate.validator.fail_fast", "true")
            factoryBean.setValidationProperties(properties)
            // 加载配置
            factoryBean.afterPropertiesSet()
            return factoryBean.validator
        }
    }
}
